package com.kedacom.demo.websocket.server;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@ServerEndpoint("/websocket")
public class MyWebSocketServer {

	private Logger logger = LoggerFactory.getLogger(getClass());

	private static List<Session> sessions = new ArrayList<Session>();

	/**
	 * 连接建立成功调用的方法
	 * @param session 可选的参数。session为与某个客户端的连接会话，需要通过它来给客户端发送数据
	 */
	@OnOpen
	public void onOpen(Session session) {
		sessions.add(session);
		logger.info("有新连接加入，session id：{}，当前在线人数为：{}", session.getId(), sessions.size());
	}

	/**
	 * 连接关闭调用的方法
	 * @throws IOException
	 */
	@OnClose
	public void onClose(Session session) throws IOException {
		sessions.remove(session);
		logger.info("有连接关闭，session id：{}，当前在线人数为：{}", session.getId(), sessions.size());
	}

	/**
	 * 收到客户端消息后调用的方法
	 * @param message 客户端发送过来的消息
	 * @param session 可选的参数
	 */
	@OnMessage
	public void onMessage(Session session, String message) {
		logger.info("来自客户端（{}）的消息：{}", session.getId(), message);

		// TODO: 处理收到消息后的业务逻辑

		// TODO: 这里演示了群发消息，并不是实际的业务场景
		for (Session s : sessions) {
			try {
				this.sendMessage(s, message);
			} catch (IOException e) {
				e.printStackTrace();
				continue;
			}
		}
	}

	/**
	 * 发生错误时调用
	 * @param session
	 * @param e
	 */
	@OnError
	public void onError(Session session, Throwable e) {
		logger.error("服务器端发生错误：{}", e.getMessage());
	}

	/**
	 * 这个方法与上面几个方法不一样。没有用注解，是根据自己需要添加的方法。
	 * @param message
	 * @throws IOException
	 */
	public void sendMessage(Session session, String message) throws IOException {
		session.getBasicRemote().sendText(message);
		// session.getAsyncRemote().sendText(message);
	}

}
